<?php

declare(strict_types=1);

use think\migration\Migrator;

class CreateProductTables extends Migrator
{
    public function change(): void
    {
        $this->createProdCategoryTable();
        $this->createProdBrandTable();
        $this->createProdTable();
        $this->createProdSkuTable();
    }

    private function createProdCategoryTable(): void
    {
        $this->table('prod_category', [
            'comment' => '商品类目',
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
        ])
            ->addColumn('name', 'string', [
                'limit' => 120,
                'comment' => '类目名称',
            ])
            ->addColumn('slug', 'string', [
                'limit' => 120,
                'comment' => '类目标识',
            ])
            ->addColumn('parent_id', 'integer', [
                'signed' => false,
                'default' => 0,
                'comment' => '父级ID',
            ])
            ->addColumn('level', 'tinyinteger', [
                'default' => 1,
                'comment' => '层级',
            ])
            ->addColumn('path', 'string', [
                'limit' => 255,
                'default' => '',
                'comment' => '路径 /1/3/',
            ])
            ->addColumn('icon_url', 'string', [
                'limit' => 255,
                'default' => '',
                'comment' => '图标',
            ])
            ->addColumn('cover_url', 'string', [
                'limit' => 255,
                'default' => '',
                'comment' => '封面',
            ])
            ->addColumn('description', 'string', [
                'limit' => 255,
                'default' => '',
                'comment' => '描述',
            ])
            ->addColumn('content', 'text', [
                'null' => true,
                'comment' => '富文本描述',
            ])
            ->addColumn('sort', 'integer', [
                'default' => 0,
                'comment' => '排序',
            ])
            ->addColumn('is_visible', 'tinyinteger', [
                'signed' => false,
                'default' => 1,
                'comment' => '是否展示',
            ])
            ->addTimestamps()
            ->addColumn('delete_time', 'timestamp', [
                'null' => true,
                'comment' => '删除时间',
            ])
            ->addIndex(['slug'], ['unique' => true])
            ->addIndex(['parent_id'])
            ->addIndex(['level'])
            ->create();
    }

    private function createProdBrandTable(): void
    {
        $this->table('prod_brand', [
            'comment' => '品牌字典',
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
        ])
            ->addColumn('name', 'string', [
                'limit' => 150,
                'comment' => '品牌名称',
            ])
            ->addColumn('slug', 'string', [
                'limit' => 150,
                'comment' => '品牌标识',
            ])
            ->addColumn('logo_url', 'string', [
                'limit' => 255,
                'default' => '',
                'comment' => 'Logo',
            ])
            ->addColumn('banner_url', 'string', [
                'limit' => 255,
                'default' => '',
                'comment' => 'Banner',
            ])
            ->addColumn('description', 'string', [
                'limit' => 255,
                'default' => '',
                'comment' => '描述',
            ])
            ->addColumn('content', 'text', [
                'null' => true,
                'comment' => '详情',
            ])
            ->addColumn('origin_country', 'string', [
                'limit' => 80,
                'default' => '',
                'comment' => '原产国',
            ])
            ->addColumn('owner_org_id', 'integer', [
                'signed' => false,
                'null' => true,
                'comment' => '归属卖家组织',
            ])
            ->addColumn('sort', 'integer', [
                'default' => 0,
                'comment' => '排序',
            ])
            ->addColumn('is_visible', 'tinyinteger', [
                'signed' => false,
                'default' => 1,
                'comment' => '是否展示',
            ])
            ->addTimestamps()
            ->addColumn('delete_time', 'timestamp', [
                'null' => true,
                'comment' => '删除时间',
            ])
            ->addIndex(['slug'], ['unique' => true])
            ->addIndex(['owner_org_id'])
            ->create();
    }

    private function createProdTable(): void
    {
        $this->table('prod', [
            'comment' => '商品 SPU',
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
        ])
            ->addColumn('org_id', 'integer', [
                'signed' => false,
                'comment' => '卖家组织ID',
            ])
            ->addColumn('category_id', 'integer', [
                'signed' => false,
                'comment' => '类目ID',
            ])
            ->addColumn('brand_id', 'integer', [
                'signed' => false,
                'null' => true,
                'comment' => '品牌ID',
            ])
            ->addColumn('name', 'string', [
                'limit' => 180,
                'comment' => '商品名称',
            ])
            ->addColumn('spu_code', 'string', [
                'limit' => 120,
                'comment' => 'SPU 编码',
            ])
            ->addColumn('summary', 'string', [
                'limit' => 255,
                'default' => '',
                'comment' => '商品摘要',
            ])
            ->addColumn('cover_url', 'string', [
                'limit' => 255,
                'default' => '',
                'comment' => '主图',
            ])
            ->addColumn('gallery', 'json', [
                'null' => true,
                'comment' => '图片集',
            ])
            ->addColumn('attributes', 'json', [
                'null' => true,
                'comment' => '自定义属性',
            ])
            ->addColumn('status', 'tinyinteger', [
                'signed' => false,
                'default' => 1,
                'comment' => '状态 0-下架 1-上架 2-草稿',
            ])
            ->addColumn('audit_status', 'tinyinteger', [
                'signed' => false,
                'default' => 0,
                'comment' => '审核状态 0-待审 1-通过 2-拒绝',
            ])
            ->addColumn('audit_remark', 'string', [
                'limit' => 255,
                'default' => '',
                'comment' => '审核备注',
            ])
            ->addColumn('audit_at', 'timestamp', [
                'null' => true,
                'comment' => '审核时间',
            ])
            ->addColumn('audit_by', 'integer', [
                'signed' => false,
                'null' => true,
                'comment' => '审核人',
            ])
            ->addTimestamps()
            ->addColumn('delete_time', 'timestamp', [
                'null' => true,
                'comment' => '删除时间',
            ])
            ->addIndex(['org_id'])
            ->addIndex(['category_id'])
            ->addIndex(['brand_id'])
            ->addIndex(['spu_code'], ['unique' => true])
            ->addIndex(['status'])
            ->create();
    }

    private function createProdSkuTable(): void
    {
        $this->table('prod_sku', [
            'comment' => '商品 SKU',
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
        ])
            ->addColumn('prod_id', 'integer', [
                'signed' => false,
                'comment' => 'SPU ID',
            ])
            ->addColumn('sku_code', 'string', [
                'limit' => 150,
                'comment' => 'SKU 编码',
            ])
            ->addColumn('specs', 'json', [
                'null' => true,
                'comment' => '规格组合',
            ])
            ->addColumn('cost_price', 'decimal', [
                'precision' => 12,
                'scale' => 2,
                'default' => 0,
                'comment' => '成本价',
            ])
            ->addColumn('sale_price', 'decimal', [
                'precision' => 12,
                'scale' => 2,
                'default' => 0,
                'comment' => '销售价',
            ])
            ->addColumn('inventory', 'integer', [
                'default' => 0,
                'comment' => '库存数量',
            ])
            ->addColumn('alert_stock', 'integer', [
                'default' => 0,
                'comment' => '预警库存',
            ])
            ->addColumn('status', 'tinyinteger', [
                'signed' => false,
                'default' => 1,
                'comment' => '状态 0-禁用 1-启用',
            ])
            ->addTimestamps()
            ->addColumn('delete_time', 'timestamp', [
                'null' => true,
                'comment' => '删除时间',
            ])
            ->addIndex(['prod_id'])
            ->addIndex(['sku_code'], ['unique' => true])
            ->addIndex(['status'])
            ->create();
    }
}
